import { prisma } from '../src/db'
import { cardSellService } from '../src/services/cardSellService'

/**
 * 测试产品配置系统是否正常工作
 * 验证售卡流程是否使用数据库配置而不是硬编码映射
 */
async function testProductConfig() {
  try {
    console.log('🧪 开始测试产品配置系统...\n')

    // 1. 显示当前数据库中的产品配置
    console.log('📊 当前数据库中的产品配置:')
    console.log('=' .repeat(80))
    const configs = await prisma.productConfig.findMany({
      orderBy: { sortOrder: 'asc' }
    })

    if (configs.length === 0) {
      console.log('❌ 数据库中没有产品配置数据!')
      return
    }

    configs.forEach((config, index) => {
      const status = config.isActive ? '✅ 启用' : '❌ 禁用'
      console.log(`${index + 1}. ${config.coinAmount}M金币 → 产品ID: ${config.productId} ${status}`)
    })
    console.log('=' .repeat(80))

    // 2. 测试不同金额的金币计算和产品ID匹配
    const testAmounts = [
      2.75,   // 应该匹配 0.5M金币 → 产品ID 15
      11,     // 应该匹配 2M金币 → 产品ID 16
      27.5,   // 应该匹配 5M金币 → 产品ID 38
      55,     // 应该匹配 10M金币 → 产品ID 17
      110,    // 应该匹配 20M金币 → 产品ID 39
      220,    // 应该匹配 40M金币 → 产品ID 40
      275,    // 应该匹配 50M金币 → 产品ID 41
      302.5,  // 应该匹配 55M金币 → 产品ID 19
      550,    // 应该匹配 100M金币 → 产品ID 18
      1925,   // 应该匹配 350M金币 → 产品ID 20
      33,     // 应该匹配 6M金币 → 无匹配产品
    ]

    console.log('\n🔍 测试金额计算和产品ID匹配:')
    console.log('=' .repeat(80))

    for (const amount of testAmounts) {
      console.log(`\n💰 测试金额: ${amount} THB`)

      try {
        const result = await cardSellService.calculateCoinsAndProductId(amount)

        if (result.productId) {
          // 查找对应的配置信息
          const matchedConfig = configs.find(c => c.productId === result.productId)
          console.log(`   计算结果: ${result.coins}M金币`)
          console.log(`   匹配产品: ID ${result.productId} (${matchedConfig?.description || '未知'})`)
          console.log(`   ✅ 匹配成功`)
        } else {
          console.log(`   计算结果: ${result.coins}M金币`)
          console.log(`   匹配产品: 无`)
          console.log(`   ⚠️  无匹配产品`)
        }
      } catch (error) {
        console.log(`   ❌ 计算失败: ${error instanceof Error ? error.message : '未知错误'}`)
      }
    }

    // 3. 测试修改配置的影响
    console.log('\n🔧 测试配置修改的影响:')
    console.log('=' .repeat(80))

    // 临时禁用一个配置
    const testConfig = configs.find(c => c.coinAmount === 2)
    if (testConfig) {
      console.log(`\n🔄 临时禁用 ${testConfig.coinAmount}M金币配置...`)
      await prisma.productConfig.update({
        where: { id: testConfig.id },
        data: { isActive: false }
      })

      // 测试11 THB (应该是2M金币，但现在被禁用了)
      console.log(`💰 测试金额: 11 THB (之前能匹配2M金币)`)
      const result = await cardSellService.calculateCoinsAndProductId(11)

      if (result.productId) {
        console.log(`   ❌ 意外匹配到产品ID: ${result.productId}`)
      } else {
        console.log(`   ✅ 正确结果: 无匹配产品 (配置已禁用)`)
      }

      // 恢复配置
      console.log(`🔄 恢复配置...`)
      await prisma.productConfig.update({
        where: { id: testConfig.id },
        data: { isActive: true }
      })

      // 再次测试
      const result2 = await cardSellService.calculateCoinsAndProductId(11)
      if (result2.productId === testConfig.productId) {
        console.log(`   ✅ 配置恢复成功，重新匹配到产品ID: ${result2.productId}`)
      }
    }

    // 4. 性能测试
    console.log('\n⚡ 性能测试:')
    console.log('=' .repeat(80))

    const startTime = Date.now()
    const testRounds = 100

    for (let i = 0; i < testRounds; i++) {
      await cardSellService.calculateCoinsAndProductId(55) // 测试10M金币
    }

    const endTime = Date.now()
    const avgTime = (endTime - startTime) / testRounds

    console.log(`执行 ${testRounds} 次查询，平均耗时: ${avgTime.toFixed(2)}ms`)

    if (avgTime < 50) {
      console.log('✅ 性能良好')
    } else if (avgTime < 200) {
      console.log('⚠️ 性能一般')
    } else {
      console.log('❌ 性能较差，建议优化')
    }

    console.log('\n🎉 产品配置系统测试完成!')
    console.log('✅ 售卡流程已成功从硬编码映射切换到数据库动态配置')

  } catch (error) {
    console.error('❌ 测试过程中出错:', error)
  } finally {
    await prisma.$disconnect()
  }
}

// 运行测试
testProductConfig().catch((error) => {
  console.error('测试脚本执行失败:', error)
  process.exit(1)
})